package org.agilelang.editor.view.filesystem;

/*
 AgileLang - A fourth generation language(http://www.agilelang.org).

 Copyright (C) 2013 Roderick Cusirramos (roderick20@hotmail.com)

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
import org.agilelang.editor.view.tree.*;
import java.awt.*;
import java.io.File;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import org.agilelang.editor.ViewFrame;
import org.agilelang.editor.tool.Util;

// Esta es la clase que va a permitir personalizar la presentación
// de cada una de las ramas del árbol, de forma que no solamente
// tengamos el texto correspondiente a la carta, o palo de la
// baraja, sino un icono mostrando su imagen
public class RendererTree extends JLabel implements TreeCellRenderer {

    private ImageIcon app;
    private ImageIcon[] folder;
    private ImageIcon[] files;
    private boolean seleccionado;
    ViewFrame frame;
    String path;

    public RendererTree(String path) {
        this.path = path;
        // Cargamos las imgenes de las cartas
        app = new ImageIcon(Util.getIconImage("org/agilelang/editor/resources/img16/app.png"));//
        folder = new ImageIcon[2];
        folder[0] = new ImageIcon(Util.getIconImage("org/agilelang/editor/resources/img16/folder.png"));
        folder[1] = new ImageIcon(Util.getIconImage("org/agilelang/editor/resources/img16/folder-open.png"));
        files = new ImageIcon[1];
        files[0] = new ImageIcon(Util.getIconImage("org/agilelang/editor/resources/img16/file.png"));
        /*files[1] = new ImageIcon( getIconImage("ModelTree/file-php.png") );
         files[2] = new ImageIcon( getIconImage("ModelTree/file-html.png") );
         files[3] = new ImageIcon( getIconImage("ModelTree/file-css.png") );
         files[4] = new ImageIcon( getIconImage("ModelTree/file-js.png") );
         files[5] = new ImageIcon( getIconImage("ModelTree/file-properties.png") );
         files[6] = new ImageIcon( getIconImage("ModelTree/file-ini.png") );
         files[7] = new ImageIcon( getIconImage("ModelTree/file-sql.png") );
         files[8] = new ImageIcon( getIconImage("ModelTree/file-config.png") );
         files[9] = new ImageIcon( getIconImage("ModelTree/file-access.png") );
         files[10] = new ImageIcon( getIconImage("ModelTree/file-image.png") );
         files[11] = new ImageIcon( getIconImage("ModelTree/file-xml.png") );*/
    }

    public Component getTreeCellRendererComponent(JTree arbol,
            Object valor, boolean seleccionado, boolean expandido,
            boolean rama, int fila, boolean conFoco) {
        // Hay que encontrar el nodo en que estamos y coger el
        // texto que contiene

        DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) valor;

        String texto = (String) nodo.toString();

        this.seleccionado = seleccionado;
        // Se fija el color de fondo en función de que esté o no
        // seleccionada la celda del árbol
        if (!seleccionado) {
            setForeground(Color.black);
        } else {
            setForeground(Color.white);
        }
        // Fijamos el icono que corresponde al texto de la celda, para
        // presentar la imagen de la carta que corresponde a esa celda

        //Model.Instance().get("ProjectPath")+Model.Instance().get("ProjectName");
        //System.out.println("->" + texto + " - " + path +" - ");
        String pathx = "";
        for (TreeNode nodo1 : nodo.getPath()) {
            //System.out.print(nodo1.toString() + " - ");
            pathx += nodo1.toString() + File.separator;
        }
        //System.out.println(pathx);
        File dir_app = new File(path);

        File directorio = new File(dir_app.getParent() + File.separator + pathx);
        if (directorio.getAbsolutePath().equals(path)) {
            setIcon(app);
            setText("  " + directorio.getName() + "  ");
            return (this);
        }

        if (directorio.isDirectory()) {
            setIcon(folder[0]);
            setText("  " + directorio.getName() + "  ");
            return (this);
        } else {
            if (texto.endsWith(".xml")) {
                setIcon(files[0]);
                setText("  " + directorio.getName() + "  ");
                return (this);
            }
            if (texto.endsWith(".sql")) {
                setIcon(files[0]);
                setText("  " + directorio.getName() + "  ");
                return (this);
            }
            if (texto.endsWith(".agile")) {
                setIcon(files[0]);
                setText("  " + directorio.getName() + "  ");
                return (this);
            } else {
                setIcon(files[0]);
                setText("  " + directorio.getName() + "  ");
                return (this);
            }
        }
    }

    // Sobreescribimos el método paint() para fijar el color de
    // fondo. Normalmente, un JLabel puede pintar su propio fondo,
    // pero, seguramente debido aparentemente a un bug, o a una
    // limitación en el TreeCellRenderer, es necesario recurrir
    // al método paint() para hacer esto
    public void paint(Graphics g) {
        Color color;
        Icon currentI = getIcon();

        // Fijamos el colos de fondo
        //color = seleccionado ? Color.BLUE : Color.white;
        color = seleccionado ? new Color(100, 149, 237) : Color.white;
        //
        g.setColor(color);
        // Rellenamos el rectángulo que ocupa el texto sobre la
        // celda del árbol
        g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);

        super.paint(g);
    }

}
